package com.sky.config;

import com.sky.interceptor.JwtTokenAdminInterceptor;
import com.sky.interceptor.JwtTokenUserInterceptor;
import com.sky.json.JacksonObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.List;

/**
 * 配置类，注册web层相关组件
 */
@Configuration
@Slf4j
public class WebMvcConfiguration implements WebMvcConfigurer
    {
        
        @Autowired
        private JwtTokenAdminInterceptor jwtTokenAdminInterceptor;
        
        @Autowired
        private JwtTokenUserInterceptor jwtTokenUserInterceptor;
        
        /**
         * 注册自定义拦截器
         *
         * @param registry 注册表
         */
        @Override
        public void addInterceptors(InterceptorRegistry registry)
            {
                log.info("开始注册自定义拦截器...");
                //管理端
                registry.addInterceptor(jwtTokenAdminInterceptor)
                        .addPathPatterns("/admin/**")
                        .excludePathPatterns("/admin/employee/login");
                
                //用户端
                registry.addInterceptor(jwtTokenUserInterceptor)
                        .addPathPatterns("/user/**")
                        .excludePathPatterns("/user/user/login")
                        .excludePathPatterns("/user/shop/status");
            }
        
        /**
         * 通过knife4j生成管理端接口文档
         *
         * @return {@link Docket }
         */
        //TODO Encounter 2024/09/21 20:24 knife4j因版本问题不生效，暂未解决，可用Apifox代替
        @Bean
        public Docket docketAdmin()
            {
                ApiInfo apiInfo = new ApiInfoBuilder()
                        .title("苍穹外卖项目接口文档")
                        .version("2.0")
                        .description("苍穹外卖项目接口文档")
                        .build();
                
                return new Docket(DocumentationType.SWAGGER_2)
                        .groupName("管理端接口")
                        .apiInfo(apiInfo)
                        .select()
                        .apis(RequestHandlerSelectors.basePackage("com.sky.controller"))
                        .paths(PathSelectors.any())
                        .build();
            }
        
        /**
         * 通过knife4j生成用户端接口文档
         *
         * @return {@link Docket }
         */
        @Bean
        public Docket docketUser()
            {
                ApiInfo apiInfo = new ApiInfoBuilder()
                        .title("苍穹外卖项目接口文档")
                        .version("2.0")
                        .description("苍穹外卖项目接口文档")
                        .build();
                return new Docket(DocumentationType.SWAGGER_2)
                        .groupName("用户端接口")
                        .apiInfo(apiInfo)
                        .select()
                        .apis(RequestHandlerSelectors.basePackage("com.sky.controller"))
                        .paths(PathSelectors.any())
                        .build();
            }
        
        /**
         * 设置静态资源映射
         *
         * @param registry 注册表
         */
        public void addResourceHandlers(ResourceHandlerRegistry registry)
            {
                registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
                registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
            }
        
        /**
         * 扩展消息转换器
         *
         * @param converters 变换 器
         */
        @Override
        public void extendMessageConverters(List<HttpMessageConverter<?>> converters)
            {
                log.info("扩展消息转换器...");
                //创建一个消息转换器对象
                MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
                //为消息转换器设置一个对象转换器，对象转换器可以将Java对象序列化为Json数据
                converter.setObjectMapper(new JacksonObjectMapper());
                //将自己的消息转换器加入容器中，将自己的转换器优先级改为0
                converters.add(0, converter);
            }
    }

